﻿#ifndef QCARSTATUSFORM_H
#define QCARSTATUSFORM_H

#include <QMainWindow>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QLabel>
#include <QPushButton>
#include <QTcpSocket>
#include <QHostAddress>
#include <QSettings>
#include <qt_windows.h>
#include "qcurvegui.h"
#include "globe.h"

namespace Ui {
class QCarStatusForm;
}

class QCarStatusForm : public QMainWindow
{
    Q_OBJECT

public:
    explicit QCarStatusForm(QWidget *parent = nullptr);
    ~QCarStatusForm();
    //CAN 数据解析函数
    void controlCarMessage1(int model, int status,double speed,double angle);
    void carStatus(bool light,bool standby1,bool standby2,bool right_enable,
                   bool left_enable,bool forword_enable,bool back_enable,bool stop_car);

    void AllCarStatus(int state,int mode,int control,int await,int error,double power);

    void AllCarStatus2(int error_level,int BMS_state,int high_volt,
                       int charge_status,int tem_sys,double bat_v,double bat_i);

    void AllCarPart3(double turn_angle_1,double turn_angle_2,
                     double turn_vel_1,double turn_vel_2);
    void AllCarPart4(double speed,double angle);

public:
    //串口通讯中的函数
    /* 初始状态栏 */
    void InitStatusBar();   // 初始化状态栏
    void SetSerState();     // 设置状态栏串口状态
    void SetRecvNum();      // 设置接收字节数
    void SetSendNum();      // 设置发送字节数
    bool SetSerialPortParam(QSerialPort *serial);   // 设置串口参数，失败返回false，成功返回true
    /* 初始化CombBox控件 */
    void InitCommCmb();         // 初始化CombBox控件
    void SetPortNumCmb();       // 设置串口号
    QStringList GetEnableCommPortQt();      // 获取计算机可用串口 Qt方式
    QStringList GetEnableCommPortWin();     // 获取计算机可用串口 Windows API方式
    QString GetComm(int nIndex, bool bValue = true);
    void SetBaudCmb();          // 设置波特率
    void SetDPaityCmb();        // 设置校验位
    void SetDataBCmb();         // 设置数据位
    void SetStopBCmb();         // 设置停止位
    void SetStreamCmb();        // 设置流控制

private:

    /* 状态栏控件 */
    QLabel *m_SerStateLbl;        // 串口状态
    QLabel *m_RecvNumLbl;         // 接收字节数
    QLabel *m_SendNumLbl;         // 发送字节数
    QPushButton *m_ResetNumBtn;   // 复位计数按钮

    /* 发送、接收字节数 */
    uint m_nRecvNum;              // 接收字节数
    uint m_nSendNum;              // 发送字节数
    bool m_bOpen;                 // 标识串口状态
    bool receiveOpen = true;

    QSerialPort *m_serial;        // 串口通信类对象
    qint64 m_nReadBuffSize;       // 串口缓冲区大小




/*****************网络串口部分*******************/
private:
    QTcpSocket *tcpClient;
    QCurveGUI  *curveGui;

    QTimer mTimer;

    bool  makeSure = true;  //发送一次确认信息
    char  writeData[300] ={0};

    qint64 sendDataNum = 0;
    qint64 sendDatabyte = 0;
    qint64 receiveData = 0;
    qint64 receivebyte = 0;
//    QBitArray  writeData;
private slots:
    //客户端槽函数
    void ReadData();
    void ReadError(QAbstractSocket::SocketError);
    void onConnected();
    void onDisconnected();

    void onTimeOut(); //定时器处理函数

    void on_btn_keep_clicked();

    void on_btn_load_clicked();

    void on_btn_stop_clicked();

    void on_btn_start_clicked();

    void on_btn_open_clicked();

    void on_btn_link_clicked();

    void on_btn_break_clicked();

    void on_btn_sendworks_clicked();

    void on_btn_charging_clicked();

    void on_btn_clear_receive_clicked();

    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_chose_file_clicked();

    void on_star_car_clicked();

    void on_textEdit_2_customContextMenuRequested(const QPoint &pos);

    void on_act_socket_triggered();

    void on_btn_band_rate_currentIndexChanged(int index);

    void slot_ResetNumBtn_clicked();          // 复位计数

    void slot_RecvPortData();               // 接收串口数据
    void on_act_curve_triggered();

private:
    Ui::QCarStatusForm *ui;
};

#endif // QCARSTATUSFORM_H
